package com.yj.springbootasync.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.ThreadPoolExecutor;

@Configuration
public class AsyncPoolConfig {
//ThreadPoolTaskExecutor是spring core包中的，
// 而ThreadPoolExecutor是JDK中的JUC。
// ThreadPoolTaskExecutor是对ThreadPoolExecutor进行了封装处理。

    @Bean
    public ThreadPoolTaskExecutor asyncThreadPoolExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(20); //核心线程数
        executor.setMaxPoolSize(200); //最大线程数
        executor.setQueueCapacity(25); //阻塞队列容量
        executor.setThreadNamePrefix("asyncThread"); //设置线程前缀

        //  setWaitForTasksToCompleteOnShutdown（true）该方法就是这里的关键，
        //  用来设置线程池关闭的时候等待所有任务都完成再继续销毁其他的Bean，
        //  这样这些异步任务的销毁就会先于Redis线程池的销毁。
        //  =setAwaitTerminationSeconds(60)，该方法用来设置线程池中任务的等待时间，
        //  如果超过这个时候还没有销毁就强制销毁，以确保应用最后能够被关闭，而不是阻塞住。
        executor.setWaitForTasksToCompleteOnShutdown(true); //是否等所有的任务都完成再关机
        executor.setAwaitTerminationSeconds(60);
        executor.initialize();
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());//设置拒绝策略
        return executor;
        
        
    }

   

}
